package com.naiterui.common.repository.page;

import java.util.List;

/**
 * 分页操作涉及内容及分页信息的转换工具类
 * 用于自定义的Page对象
 *
 * @author zhouyanxin
 * @since 1.0.0
 */
public class CustomizedPageConvertor {

    /**
     * 用于将分页查询返回的分页对象中的实体结果集转换为指定类型的VO对象集合
     * CustomizedPageConvertor.entityConvert()
     *
     * @param page
     * @param targetClassType
     *
     * @return
     *
     * @Author zhouyanxin
     * @Date 2018年6月7日
     * @since 1.0.0
     */
    public static <S, T> Page<T> entityConvert(Page<S> page, Class<T> targetClassType) {
        return page.map(new SimplePageContentConvert<>(targetClassType));
    }

    /**
     * 用户将数据查询得到的分页对象Page转换为PageVO对象
     * CustomizedPageConvertor.pageConvert()
     *
     * @param page
     *
     * @return
     *
     * @Author zhouyanxin
     * @Date 2018年6月7日
     * @since 1.0.0
     */
    public static <T> PageVO<T> pageConvert(Page<T> page) {
        return PageVO.newBuilder().pageNo(page.getPageNo()).pageSize(page.getPageSize()).totalCount((int) page.getTotalCount()).result(page.getResult()).offset(page.getOffset()).build();
    }

    /**
     * 用户将数据查询得到的分页对象Page转换为PageVO对象
     * CustomizedPageConvertor.pageConvert()
     *
     * @param page
     *
     * @return
     *
     * @Author 王泽浩
     * @Date 2018年6月8日
     * @since 1.0.0
     */
    public static <T> PageVO<T> pageConvert(Page<?> page, List<T> results) {
        return PageVO.newBuilder().pageNo(page.getPageNo()).pageSize(page.getPageSize()).totalCount((int) page.getTotalCount()).result(results).offset(page.getOffset()).build();
    }

    /**
     * 将通过Repository进行query返回的Page<Entity>对象，转换成对应的PageVO<EntityVO>
     * CustomizedPageConvertor.convert()
     *
     * @param page
     * @param targetClassType
     *
     * @return
     *
     * @Author zhouyanxin
     * @Date 2018年6月7日
     * @since 1.0.0
     */
    public static <S, T> PageVO<T> convert(Page<S> page, Class<T> targetClassType) {
        return pageConvert(entityConvert(page, targetClassType));
    }

    public static <T> PageVO<T> buildPageVOWithCustom(int pageNo, int pageSize, List<T> results, int totalCount) {
        return PageVO.newBuilder().pageNo(pageNo).pageSize(pageSize).totalCount(totalCount).result(results).build();
    }

    public static <T> PageVO<T> buildPageVOWithCustom(int pageNo, int pageSize, List<T> results, int totalCount, String orderBy) {
        return PageVO.newBuilder().pageNo(pageNo).pageSize(pageSize).totalCount(totalCount).result(results).orderBy(orderBy).build();
    }

    public static <T> PageVO<T> buildPageVOWithCustom(int pageNo, int pageSize, List<T> results, int totalCount, int offset) {
        return PageVO.newBuilder().pageNo(pageNo).pageSize(pageSize).totalCount(totalCount).result(results).offset(offset).build();
    }

}
